import 'dart:io';
import 'dart:isolate';

import 'package:flutter/foundation.dart';

///Dart中的多线程Isolate    真正的异步

String _data = '0';

int a = 10;

void main() {
  ///多线程示例
  // isoLateDemo();

  /// a值问题，a不变
  // isoLateDemo2();

  /// a值问题,a改变
  // isoLateDemo3();

  computerTest();
}

/// IsoLate 更像一个进程！！！它有独立的运行空间，不需要锁

/**多线程操作：
 *
 *  外部代码1
    第1个来了10
    第2个来了10
    第1个来了10
    第2个来了10
    第1个来了10
    第1个来了10
    第2个来了10
    第2个来了10
    外部代码2
 */
void isoLateDemo() {
  print('外部代码1');

  Isolate.spawn(func, 10);
  Isolate.spawn(func2, 10);
  Isolate.spawn(func, 10);
  Isolate.spawn(func2, 10);
  Isolate.spawn(func, 10);
  Isolate.spawn(func2, 10);
  Isolate.spawn(func, 10);
  Isolate.spawn(func2, 10);
  sleep(Duration(seconds: 2));
  print('外部代码2');
}

/** a 未改变
 *
 *  外部代码1
    第一个来了：a=100
    a=10
    外部代码2
 */
void isoLateDemo2() {
  print('外部代码1');
  Isolate.spawn(func3, 100);
  sleep(Duration(seconds: 2));
  print('a=$a');
  print('外部代码2');
}

/**
 *  a改变
 *
 *  数据完全隔离开
 *
 *  外部代码1
    a=10
    外部代码2
    接收到了100
 */
void isoLateDemo3() async {
  print('外部代码1');
  //创建一个port
  ReceivePort port = ReceivePort();
  //创建ioslate
  Isolate isolate = await Isolate.spawn(func4, port.sendPort);
  //监听数据变化
  port.listen((message) {
    a = message;
    print('接收到了$a');
    port.close();
    isolate.kill();
  });
  print('a=$a');
  print('外部代码2');
}

/** compute是对isolate的封装
 *
 *  I/flutter (24205): 外部代码1
    I/flutter (24205): 第2个来了
    I/flutter (24205): 外部代码2: b=10000 a=10
 */
void computerTest() async {
  print('外部代码1');

  int b = await compute(func5, 10);

  print('外部代码2: b=$b a=$a');
}

func(int count) {
  print('第1个来了$count');
}

func2(int count) {
  print('第2个来了$count');
}

func3(int count) {
  a = count;
  print('第一个来了：a=$a');
}

func4(SendPort sendPort) {
  sleep(Duration(seconds: 1));
  sendPort.send(100);
}

int func5(int count) {
  a = 999;
  sleep(Duration(seconds: 2));
  print('第2个来了');
  return 10000;
}
